package com.sh.optional;

import cn.hutool.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @Auther: sh
 * @Date: 2024/11/28 00:11
 * @Description:
 */
public class Main {
    public static void main(String[] args) {

        test1();
        test2();
    }


    public static void test1() {
        // 声明一个空Optional
        Optional<Object> empty = Optional.empty();

        // 依据一个非空值创建Optional
        Student student = new Student();
        Optional<Student> os1 = Optional.of(student);
        boolean present = os1.isPresent();
        System.out.println(present);

        // 可接受null的Optional
        Student student1 = null;
        Optional<Student> os2 = Optional.ofNullable(student1);

        // 利用Optional的ifPresent方法做出如下：当student不为空的时候将name赋值为张三
        Optional.ofNullable(student1).ifPresent(p -> p.setName("张三"));
        System.out.println(student1);

        System.out.println(os2);
    }


    public static void test2() {

        // 假设 student 这个对象从数据库中查出的
        Student student = getStudent();
        // 创建一个可接受 null 的 Optiona l类
        Optional<Student> optional = Optional.ofNullable(student);
        // 用法1:获取 student 对象中的某个值，如果不存在的话则取默认值（不具有短路作用）
        /**
         * 这里的没有短路怎么理解呢？
         * 就是无论 getAge 的返回值是 null 还是 什么 ，都会执行 orElse 方法
         * 在下面那个有短路作用的例子中，如果 getAge 的返回值不是 null ，那么就不会执行 orElseGet 方法
         */
        Integer a1 = optional.map(Student::getAge).orElse(20);
        // 用法2:获取 student 对象中的某个值,如果不存在的话则取默认值（具有短路作用，因为是懒加载）
        Integer a2 = optional.map(Student::getAge).orElseGet(() -> Integer.MAX_VALUE);



        // 用法3:判断对象是否存在，不存在则抛出异常
        optional.orElseThrow(() -> new RuntimeException("student不存在!"));
        // 用法4:判断对象是否存在，存在的话对对象进行操作，例如给对象赋初始值
        optional.ifPresent(o -> o.setAge(18));
        // 用法5:对象存在时,且年龄满足一定条件容器才会继续保存这对象,否则将会剔除
        optional.filter(o -> o.getAge() > 10);



    }

    private static Student getStudent() {
        return new Student("张三", 18);
    }


    /**
     * 下面是实战作用
     *  这里本来是  dataGobalService.getMapIconInfo(beginTime, endTime) 返回值要判断是否为空，空的话就给一个 ArrayList 的对象
     *  那么原始代码应该是
     *  List<GobalMapIconVo> gobalTempMapVoList = dataGobalService.getMapIconInfo(beginTime, endTime);
     *  if（gobalTmepMapVoList==null || gobalTmpMapVoList.length==0 ） {
     *      gobalTempMapVoList = new ArrayList<>();
     *  }
     *
     *  但是现在可以这样写
     *  List<GobalMapIconVo> gobalTempMapVoList = Optional.ofNullable(dataGobalService.getMapIconInfo(beginTime, endTime)).orElseGet(ArrayList::new);
     */
//    List<GobalMapIconVo> gobalTempMapVoList = Optional.ofNullable(dataGobalService.getMapIconInfo(beginTime, endTime)).
//            orElseGet(ArrayList::new);
//    JSONObject data = new JSONObject()
//            .fluentPut("gobalTempMapVoList", gobalTempMapVoList);


}

